package org.prism.reflection;
//动态代理
//      1、被代理类
//      2、接口
//      3、创建代理类实例

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//写一个接口  让代理类和被代理都实现它
interface ActorFactory{
    //演员们有一个表演的方法
    void show();
}
//具体实现类（被代理类） --演员刘德华
class LDHActor implements ActorFactory{
    @Override
    public void show() {
        System.out.println("刘德华出演无间道1、2、3！！");
    }
}
class ProxyFactory{
    //动态创建（代理类）  --刘德华的经纪人
    public static Object getProxyInstance(Object obj){
        IceInvocationHandler handler = new IceInvocationHandler(obj);
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),handler);
    }
}
class IceInvocationHandler implements InvocationHandler{
    private Object obj;

    public IceInvocationHandler(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        MethodUtil methodUtil = new MethodUtil();
        methodUtil.function1();
        Object invoke = method.invoke(obj, args);
        methodUtil.function2();
        return invoke;
    }
}

public class IceCream {
    public static void main(String[] args) {
        LDHActor ldhActor = new LDHActor();
        ActorFactory proxyInstance = (ActorFactory) ProxyFactory.getProxyInstance(ldhActor);
        proxyInstance.show();

    }
}
class MethodUtil{
    public void function1(){
        System.out.println("陈永仁不适合刘德华来演！！");
    }
    public void function2(){
        System.out.println("韩砷不适合刘德华来演！！");
    }
}
